#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <mqueue.h>
#include <string.h>

static char *mq_name = "/mq_test"; // 队列文件的路径， /代表队列文件所在的目录 /dev/mqueue
static mqd_t mqd;                  // 消息队列的描述符   description

void *first_thread_func(void *arg)
{
    printf("first线程开始执行 \n");
    sleep(1);
    char *msg = "hello,world";             // 发送消息
    mq_send(mqd, msg, strlen(msg) + 1, 0); // 发送消息到队列
    return NULL;
}

void *second_thread_func(void *arg)
{
    printf("second线程开始执行 \n");
    sleep(2);
    char rec_buf[100];                                             // 接收消息的缓冲区
    ssize_t len = mq_receive(mqd, rec_buf, sizeof(rec_buf), NULL); // 接收消息队列中的消息
    printf("接收到消息：%s, len=%ld \n", rec_buf, len);
    return NULL;
}

int main(int argc, char *argv[])
{
    printf("main线程开始执行!\n");

    struct mq_attr attr;   // 队列属性
    attr.mq_maxmsg = 10;   // 最大消息数
    attr.mq_msgsize = 100; // 消息大小
    // 创建队列
    mqd = mq_open(mq_name, O_CREAT | O_RDWR, 0666, &attr);
    if (mqd == -1)
    {
        perror("创建队列失败！");
        return -1;
    }

    pthread_t first;  // 线程标识
    pthread_t second; // 线程标识
    pthread_create(&first, NULL, first_thread_func, NULL);
    pthread_create(&second, NULL, second_thread_func, NULL);

    pthread_join(first, NULL);  // 等待线程结束
    pthread_join(second, NULL); // 等待线程结束

    printf("main线程执行结束!\n");

    // 关闭消息队列
    mq_close(mqd);
    // 删除消息队列
    mq_unlink(mq_name);

    return 0;
}